/* 模板方法模式 */

pub trait Game {
    fn play(&self){
        self.init();
        self.startPlay();
        self.endPlay();
    }

    fn init(&self);

    fn startPlay(&self);

    fn endPlay(&self);
}

pub struct Mario {}

impl Game for Mario{
    fn init(&self) {
        println!("Mario 游戏完成初始化，请开始游戏");
    }

    fn startPlay(&self) {
        println!("Mario 游戏开始");
    }

    fn endPlay(&self) {
        println!("Mario 游戏结束，请再接再厉");
    }
}

pub struct BattleCity {}

impl Game for BattleCity {
    fn init(&self) {
        println!("<<坦克大战>>游戏完成初始化，请开始游戏");
    }

    fn startPlay(&self) {
        println!("<<坦克大战>>游戏开始");
    }

    fn endPlay(&self) {
        println!("<<坦克大战>>游戏结束，最好成绩 20000分");
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_template_method_1() {
        let game = Mario{};
        game.play();
    }

    #[test]
    fn test_template_method_2() {
        let game = BattleCity{};
        game.play();
    }
}